package server

// http://www.guoxiaolong.cn/blog/?id=9217
import (
	"fmt"
	"github.com/lestrrat-go/file-rotatelogs"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"io"
	"os"
	"path/filepath"
	"time"
)

func InitLogger(workspace string) {
	logDir := workspace
	outFile := "application"
	errFile := "error"

	_, err := os.Stat(logDir)
	if err != nil {
		if os.IsNotExist(err) {
			err := os.Mkdir(logDir, os.ModePerm)
			if err != nil {
				fmt.Printf("mkdir failed![%v]\n", err)
			}
		}
	}
	// config
	config(logDir, outFile, errFile)
}

func config(logDir string, infoFile string, errFile string) {
	//获取编码器
	encoderConfig := zap.NewProductionEncoderConfig()     //NewJSONEncoder()输出json格式，NewConsoleEncoder()输出普通文本格式
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder //指定时间格式
	//encoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder    //按级别显示不同颜色，不需要的话取值zapcore.CapitalLevelEncoder就可以了
	//encoderConfig.EncodeCaller = zapcore.FullCallerEncoder        //显示完整文件路径
	consoleEncoder := zapcore.NewConsoleEncoder(encoderConfig)

	// error 日志级别
	errorLevel := zap.LevelEnablerFunc(func(lev zapcore.Level) bool { //error级别

		return lev >= zap.ErrorLevel
	})
	// info 和 debug级别,debug级别是最低的
	debugLevel := zap.LevelEnablerFunc(func(lev zapcore.Level) bool {
		return lev >= zap.DebugLevel
	})

	//info文件writeSyncer
	infoFileWriteSyncer := zapcore.AddSync(getWriter(logDir, infoFile))
	//第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志
	infoFileCore := zapcore.NewCore(consoleEncoder, zapcore.NewMultiWriteSyncer(infoFileWriteSyncer, zapcore.AddSync(os.Stdout)), debugLevel)

	//error文件writeSyncer
	errorFileWriteSyncer := zapcore.AddSync(getWriter(logDir, errFile))
	//第三个及之后的参数为写入文件的日志级别,ErrorLevel模式只记录error级别的日志
	errorFileCore := zapcore.NewCore(consoleEncoder, zapcore.NewMultiWriteSyncer(errorFileWriteSyncer, zapcore.AddSync(os.Stdout)), errorLevel)

	var coreArr []zapcore.Core
	//coreArr = append(coreArr, zapcore.NewCore(consoleEncoder, zapcore.Lock(os.Stdout), zapcore.DebugLevel))
	coreArr = append(coreArr, infoFileCore)
	coreArr = append(coreArr, errorFileCore)
	zapLogger := zap.New(zapcore.NewTee(coreArr...), zap.AddCaller()) //zap.AddCaller()为显示文件名和行号，可省略
	zap.ReplaceGlobals(zapLogger)
}

func getWriter(outputDir string, filename string) io.Writer {
	// 生成rotatelogs的Logger 实际生成的文件名  demo .log.YYmmddHH
	// demo.log是指向最新日志的链接
	// 保存7天内的日志，每1小时(整点)分割一次日志
	hook, err := rotatelogs.New(
		// 没有使用go风格反人类的format格式
		filepath.Join(outputDir, "logs", filename+"-%Y%m%d.log"),
		//rotatelogs.WithLinkName(filename),
		rotatelogs.WithMaxAge(time.Hour*24*7),
		rotatelogs.WithRotationTime(time.Hour*24),
	)
	if err != nil {
		println(err.Error())
	}
	return hook
}
